package com.nicolas.pattern.prototype;

/**
 * Prototype（抽象原型类）：它是声明克隆方法的接口，是所有具体原型类的公共父类，可以是抽象类也可以是接口，甚至还可以是具体实现类。
● ConcretePrototype（具体原型类）：它实现在抽象原型类中声明的克隆方法，在克隆方法中返回自己的一个克隆对象。
● Client（客户类）：让一个原型对象克隆自身从而创建一个新的对象，在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象，
再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程，因此用户可以根据需要选择具体原型类，
系统具有较好的可扩展性，增加或更换具体原型类都很方便。
 * @author nicolas  2017年2月11日 -- 下午8:16:12
 * 
 * WeeklyLog充当具体原型类，
 * Object类充当抽象原型类，
 * clone()方法为原型方法。
 */
public class WeeklyLog implements Cloneable{
	private  String name;
	private  String date;
	private  String content;
	
	 //为了简化设计和实现，假设一份工作周报中只有一个附件对象，
	//实际情况中可以包含多个附件，可以通过List等集合对象来实现
    private AttachmentShallow attachmentShallow;
    
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
	//克隆方法clone()，此处使用Java语言提供的克隆机制
	   public WeeklyLog clone()
	   {
	          Object obj = null;
	          try
	          {
	                 obj = super.clone();
	                 return (WeeklyLog)obj;     
	          }
	          catch(CloneNotSupportedException e)
	          {
	                 System.out.println("不支持复制！");
	                 return null;
	          }
	   }
	public AttachmentShallow getAttachmentShallow() {
		return attachmentShallow;
	}
	public void setAttachmentShallow(AttachmentShallow attachmentShallow) {
		this.attachmentShallow = attachmentShallow;
	}
}
